#!/usr/bin/perl -w
#
#
# For the addition of future services just add a variable $groupname? and then
# call the functions  &add_entry($groupname?,$username);
# where ? is a unique number.
#
#
#

use Fcntl qw(:flock);

# check arguments

if ( ($#ARGV <0) || (($#ARGV+1)>=2 ) )
{
  print <<FNUSAGETEXT;
usage : rmcadduser <user> 

FNUSAGETEXT
exit 1;
}

#Group name variables
$groupname1="IBM\.ServiceEvent";
$groupname2="IBM\.Sfp";
$groupname3="IBM\.LparCmd";
$username=$ARGV[0];
$username.="\@LOCALHOST";

#File location variables
$ori_acls_file="\/usr\/sbin\/rsct\/cfg\/ctrmc.acls";
$local_acls_file="\/var\/ct\/cfg\/ctrmc.acls";
$temp_acls_file="\/tmp\/temp_acls";
$temp_local_acls_file="\/var\/ct\/cfg\/ctrmc.acls.temp";

################################
# Main
################################

# If the acls file does not exist the copy the acls 
# file from /usr/sbin/rsct/cfg directory to /var/ct/cfg diretory
if (! -s $local_acls_file)
{
   $cmd="cp $ori_acls_file $local_acls_file";
   system($cmd);
   chmod(0755, $local_acls_file);
}

system ("cp $local_acls_file $temp_local_acls_file");

#open the acls and lock the file
if (!open(ACLS,"+<$local_acls_file"))
{
 print "Can't open $local_acls_file file :$!\n";
 exit 1;
}
for ($i=0;$i<3;$i++)
{
 if ($i>0)
 {
   if (!open(ACLS,"+<$local_acls_file"))
   {
     print "Can't open $local_acls_file file :$!\n";
     exit 1;
   }
 }
 if (!flock(ACLS,LOCK_EX|LOCK_NB))
 {
   if ($i==2)
   {
     print "Can't lock the file Handle ACLS:$!\n";
     close ACLS;
     exit 3;
   }
   else
   {
     close ACLS;
     sleep 2;
   }
 }
 else
 {
   last ;
 }
}

&add_entry($groupname1,$username,*ACLS);
&add_entry($groupname2,$username,*ACLS);
&add_entry($groupname3,$username,*ACLS);
close ACLS;

###############################
# Sub routines
###############################

sub add_entry 
{

  local ($groupname, $usrname, *ACLSFILEHDL) = @_;

  if (!open(TEMP,"+>$temp_acls_file"))
  {
    print "Can't create $temp_acls_file file :$!\n";
    system ("cp $temp_local_acls_file $local_acls_file");
    close ACLSFILEHDL;
    exit 2;
  }
  if (!flock(TEMP,LOCK_EX|LOCK_NB))
  {
    print "Can't lock the file Handle TEMP:$!\n";
    system ("cp $temp_local_acls_file $local_acls_file");
    close ACLSFILEHDL;
    exit 4;
  }

  my $dupcnt=0;
  my $cnt=0;
  $dupcnt=&checkduplicates($groupname,$usrname);
  if ($dupcnt >=1)
  {
    seek (TEMP,0,0);
    seek (ACLSFILEHDL,0,0);
    print "Duplicate entry ...Entry already exists\n";
  }
  else
  {
    seek (ACLSFILEHDL,0,0);
    seek (TEMP,0,0);
    while(<ACLSFILEHDL>)
    {
      print TEMP $_;
      if (/^$groupname/) 
      {
        print TEMP "\t $usrname \t\* rw\n";
        $cnt=+1;
       }
    }
    if ($cnt==0)
    {
      print TEMP "\n$groupname \n";
      print TEMP "\t $usrname \t\* rw\n";
    }
    seek (ACLS,0,0);
    seek (TEMP,0,0);
    system("cp $temp_acls_file $local_acls_file");
    close TEMP;
    system("rm -f $temp_acls_file");
 }
}
 
sub checkduplicates 
{
 local ($grpname,$urname) = @_;
 my $dpcnt=0;
 my $ckflg=0;

   seek (ACLSFILEHDL,0,0);
   while(<ACLSFILEHDL>)
   {
     if (/^IBM/)
     {
     if (/^$grpname/)
     {
       $ckflg=1; 
     }
     else
     {
       $ckflg=0; 
     }
     }
     if ($ckflg==1)
     {
       if (/[ \t]$urname+[ \t]/)
       {
         $dpcnt=+1; 
       }
     }
   }
return $dpcnt;
}
